#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *realloc(void *ptr, size_t new_size, size_t old_size) {
    // 如果需要的大小为0，直接释放并返回NULL
    if (new_size == 0) {
        free(ptr);
        return NULL;
    }

    // 如果原指针为NULL，直接分配新的空间
    if (ptr == NULL) {
        return malloc(new_size);
    }

    // 创建一个新的动态空间
    void *new_ptr = malloc(new_size);
    if (new_ptr == NULL) {
        return NULL; // 内存分配失败
    }

    // 拷贝原本的数据
    size_t copy_size = (new_size < old_size) ? new_size : old_size;
    memcpy(new_ptr, ptr, copy_size);

    // 释放原来的空间
    free(ptr);

    // 返回新空间
    return new_ptr;
}

int main() {
    // 示例用法
    size_t old_size = 10;
    void *ptr = malloc(old_size);
    if (ptr == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return 1;
    }

    // 填充一些数据
    for (size_t i = 0; i < old_size; i++) {
        ((char *)ptr)[i] = 'A' + i;
    }

    size_t new_size = 20;
    void *new_ptr = realloc(ptr, new_size, old_size);
    if (new_ptr == NULL) {
        fprintf(stderr, "Reallocation failed\n");
        return 1;
    }

    // 打印新空间的数据
    for (size_t i = 0; i < new_size; i++) {
        printf("%c ", ((char *)new_ptr)[i]);
    }
    printf("\n");

    // 释放新空间
    free(new_ptr);

    return 0;
}